home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / text / tex / mathekne.lha / ableiten0.976.pasc < prev    next >
Text File  |  1992-01-07  |  31KB  |  1,404 lines

  1. program AComp; (* Ableitungs-Compiler *)
  2. (* von Carsten Hammer ; alle Rechte vorbehalten *)
  3. (* Dies Programm soll die Ableitung einer Funktion berechnen *)
  4. (* und den Rechenweg in ein Latex-File ausgeben (abl.tex).   *)
  5. (* Die Vereinfachung hab ich noch nicht ganz durchschaut     *)
  6. (* und kann sie deshalb noch nicht implementieren.           *)
  7. (* Wer auch an sowas programmiert und Fragen hat oder mir    *)
  8. (* weiterhelfen kann, der melde sich unter:                  *)
  9. (* Carsten Hammer   *)
  10. (* Schwindstr.7     *)
  11. (* Bielefeld 1      *)
  12. {$path "dh0:allerlei/include/"}
  13. {$incl "req.lib","intuition.lib"}
  14.  
  15. type zeiger =^knoten;
  16.      knoten = record
  17.               a,b: zeiger;
  18.               wert: string[999];
  19.               end;
  20.      Directoryname = String[DSize];
  21.      Filename =String[Fchars];
  22.      Pathname = String[162];
  23. var wurzel: zeiger;
  24.     eingabe,ausgabe,jj,hilf:string[999];
  25.     j,k,gnot,schalter:integer;
  26.     f:text;
  27.     erlaeut:string;
  28.     dir:Directoryname;
  29.     Datei:Filename;
  30.     Pfad:Pathname;
  31.     Erfolg:long;
  32.     ESS:p_ESStructure;
  33.     FReq:Filerequester;
  34.  
  35.  
  36. function klammerrück(g:zeiger,o:integer):integer;
  37. begin
  38. repeat
  39. o:=o-1;
  40. if g^.wert[o]=")" then o:=klammerrück(g,o)-1;
  41. until g^.wert[o]="(";
  42. klammerrück:=o;
  43. end;
  44.  
  45. function klammervor(g:zeiger,o:integer):integer;
  46. begin
  47. repeat
  48. o:=o+1;
  49. if g^.wert[o]="(" then o:=klammervor(g,o)+1;
  50. until g^.wert[o]=")";
  51. klammervor:=o;
  52. end;
  53.  
  54. function xabh(p:zeiger):integer;
  55. var x:integer;
  56. begin
  57. x:=0;
  58. if p<>nil then
  59.  begin
  60.  if p^.a<>nil then x:=xabh(p^.a);
  61.  if (p^.b<>nil)and(x=0) then x:=xabh(p^.b);
  62.  if (pos("x",p^.wert)<>0)or(x<>0)then xabh:=1
  63.  else xabh:=0;
  64.  end
  65. else
  66.  begin
  67.  xabh:=0;
  68.  end;
  69. end;
  70.  
  71. procedure _ausgabe(var q:zeiger);forward;
  72.  
  73. procedure ausgeben(var p:zeiger);
  74. begin
  75. j:=1;
  76. k:=0;
  77. ausgabe:="";
  78. jj:="$$";
  79. _ausgabe(p);
  80. if erlaeut<>"" then jj:=jj+"\eqno \hbox{("+erlaeut+")}";
  81. jj:=jj+"$$";
  82. writeln(f,jj);
  83. writeln(ausgabe);
  84. end;
  85.  
  86. procedure zurückformen(var p:zeiger);
  87. begin
  88. j:=1;
  89. k:=0;
  90. ausgabe:="";
  91. jj:="$$";
  92. _ausgabe(p);
  93. jj:=jj+"$$";
  94. end;
  95.  
  96.  
  97. function prior(var h:zeiger,i:integer):integer;
  98. var pstri:char;
  99.         r:integer;
  100. begin
  101. if i<1 then i:=1;
  102. pstri:=h^.wert[i];
  103. case pstri of
  104. "+":r:=1;
  105. "-":r:=1;
  106. "*":r:=2;
  107. "/":r:=2;
  108. "^":r:=3;
  109. else
  110. r:=4;
  111. end;
  112. prior:=r;
  113. end;
  114.  
  115. procedure überprüfen(var e:zeiger);
  116. var j,ia,iz:integer;
  117.     s1,s2:string[999];
  118. begin
  119. ia:=0;
  120. iz:=0;
  121. j:=1;
  122. if length(e^.wert)>1 then
  123.  begin
  124.  if e^.wert[1]="(" then ia:=1;
  125.  if e^.wert[1]=")" then error("Klammer-zu am Anfang?");
  126.  if e^.wert[1]=" " then e^.wert:=copy(e^.wert,2,length(e^.wert)-1);
  127.  repeat
  128.  j:=j+1;
  129.  if (e^.wert[j]=" ")then e^.wert:=copy(e^.wert,1,j-1)+copy(e^.wert,j+1,length(e^.wert)-j);
  130.  s1:=copy(e^.wert,1,j-2);
  131.  if length(e^.wert)>j then s2:=copy(e^.wert,j+1,length(e^.wert)-j)
  132.  else s2:="";
  133.  (*writeln("s1,s2:",s1,":",s2,"!",ia,"k",iz);*)
  134.  if (e^.wert[j-1]="-")and(e^.wert[j]="-")then e^.wert:=s1+"+"+s2 else
  135.  if (e^.wert[j-1]="+")and(e^.wert[j]="+")then e^.wert:=s1+"+"+s2 else
  136.  if (e^.wert[j-1]="+")and(e^.wert[j]="-")then e^.wert:=s1+"-"+s2 else
  137.  if (e^.wert[j-1]="-")and(e^.wert[j]="+")then e^.wert:=s1+"-"+s2;
  138.  if e^.wert[j]="(" then ia:=ia+1;
  139.  if e^.wert[j]=")" then iz:=iz+1;
  140.  if length(e^.wert)<(length(s1+s2)+2) then j:=j-1;
  141.  if e^.wert[j]=" " then j:=j-1;
  142.  until j=length(e^.wert);
  143.  end
  144. else
  145.  begin
  146.  if e^.wert=" " then error("Leerstring?");
  147.  end;
  148. if ia<>iz then error("Klammerfehler");
  149. end;
  150.  
  151. function konst(var x:integer,var p:zeiger):integer;
  152. var a:string;
  153. begin
  154. end;
  155.  
  156. procedure umformung(var quelle:zeiger);
  157. var x,xx,t,auslass: integer;
  158.     a,b:zeiger;
  159. begin
  160. if quelle^.wert="" then error("Fehlender Term oder fehlende Klammerung");
  161. hilf:="";
  162. x:=length(quelle^.wert)+1;
  163. repeat
  164. x:=x-1;
  165. if quelle^.wert[x]=")" then
  166.  begin
  167.  hilf:=" ";
  168.  x:=klammerrück(quelle,x);
  169.  end;
  170. if x>1 then if (prior(quelle,x-1)=2)or(prior(quelle,x-1)=3) then
  171.  begin
  172.  x:=x-1;
  173.  end;
  174. until (prior(quelle,x)=1) or (x=1);
  175. if (x=1)and(prior(quelle,x)=1) then
  176.  begin
  177.  if quelle^.wert[1]="+" then       (*      +ausdruck       *)
  178.   begin
  179.   quelle^.wert:=copy(quelle^.wert,2,length(quelle^.wert)-1);
  180.   umformung(quelle);
  181.   end
  182.  else
  183.   begin
  184.   new(a);                          (*       -ausdruck        *)
  185.   a^.wert:=copy(quelle^.wert,2,length(quelle^.wert)-1);
  186.   a^.a:=nil;
  187.   a^.b:=nil;
  188.   quelle^.wert:=copy(quelle^.wert,1,1);
  189.   quelle^.a:=a;
  190.   quelle^.b:=nil;  (* redundant *)
  191.   umformung(a);
  192.   end;
  193.  end
  194. else
  195.  begin
  196.  if (prior(quelle,x)=1)and(prior(quelle,x-1)=4)and(x>1) then    (*   ausdr+ausdr  *)
  197.   begin
  198.   new(a);
  199.   new(b);
  200.   a^.wert:=copy(quelle^.wert,1,x-1);
  201.   a^.a:=nil;
  202.   a^.b:=nil;
  203.   b^.wert:=copy(quelle^.wert,x+1,length(quelle^.wert)-x);
  204.   b^.a:=nil;
  205.   b^.b:=nil;
  206.   quelle^.wert:=quelle^.wert[x];
  207.   quelle^.a:=a;
  208.   quelle^.b:=b;
  209.   umformung(a);
  210.   umformung(b);
  211.   end
  212.  else     (*    x=0    kein +\-im ausdruck  *)
  213.   begin
  214.   x:=length(quelle^.wert)+1;
  215.   repeat
  216.   x:=x-1;
  217.   if quelle^.wert[x]=")" then x:=klammerrück(quelle,x);
  218.   until (prior(quelle,x)=2) or (x=1);
  219.   if x>1 then   (*  ausdr*ausdr  *)
  220.    begin
  221.    new(a);
  222.    new(b);
  223.    a^.wert:=copy(quelle^.wert,1,x-1);
  224.    a^.a:=nil;
  225.    a^.b:=nil;
  226.    b^.wert:=copy(quelle^.wert,x+1,length(quelle^.wert)-x);
  227.    b^.a:=nil;
  228.    b^.b:=nil;
  229.    quelle^.wert:=quelle^.wert[x];
  230.    quelle^.a:=a;
  231.    quelle^.b:=b;
  232.    umformung(a);
  233.    umformung(b);
  234.    end
  235.   else
  236.    begin
  237.    x:=0;
  238.    repeat
  239.    x:=x+1;
  240.    if quelle^.wert[x]="(" then x:=klammervor(quelle,x);
  241.    until (quelle^.wert[x]="^") or (x=length(quelle^.wert));
  242.    if x<length(quelle^.wert) then                     (*   ausdr^ausdr   *)
  243.     begin
  244.     new(a);
  245.     new(b);
  246.     a^.wert:=copy(quelle^.wert,1,x-1);
  247.     a^.a:=nil;
  248.     a^.b:=nil;
  249.     b^.wert:=copy(quelle^.wert,x+1,length(quelle^.wert)-x);
  250.     b^.a:=nil;
  251.     b^.b:=nil;
  252.     quelle^.wert:=quelle^.wert[x];
  253.     quelle^.a:=a;
  254.     quelle^.b:=b;
  255.     umformung(a);
  256.     umformung(b);
  257.     end
  258.    else
  259.     begin
  260.     if quelle^.wert<>"x" then
  261.      begin
  262.      x:=length(quelle^.wert)+1;         (* ausdruckxausdruck *)
  263.      repeat
  264.      x:=x-1;
  265.      if quelle^.wert[x]=")" then x:=klammerrück(quelle,x);
  266.      until (quelle^.wert[x]="x") or (x=1);
  267.      if ("x"=quelle^.wert[x])and(x<length(quelle^.wert)) then
  268. (*  x*ausdruck oder ausdruckx*ausdruck          *)
  269.       begin
  270.       new(a);
  271.       new(b);
  272.       a^.wert:=copy(quelle^.wert,1,x);
  273.       a^.a:=nil;
  274.       a^.b:=nil;
  275.       b^.wert:=copy(quelle^.wert,x+1,length(quelle^.wert)-x);
  276.       b^.a:=nil;
  277.       b^.b:=nil;
  278.       quelle^.wert:="*";
  279.       quelle^.a:=a;
  280.       quelle^.b:=b;
  281.       umformung(a);
  282.       umformung(b);
  283.       end
  284.      else
  285.       begin
  286.       if (x=length(quelle^.wert))and(x>1) then            (* ausdruck*x       *)
  287.        begin                    (*                  *)
  288.        new(a);
  289.        new(b);
  290.        a^.wert:=copy(quelle^.wert,1,length(quelle^.wert)-1);
  291.        a^.a:=nil;
  292.        a^.b:=nil;
  293.        b^.wert:="x";
  294.        b^.a:=nil;
  295.        b^.b:=nil;
  296.        quelle^.wert:="*";
  297.        quelle^.a:=a;
  298.        quelle^.b:=b;
  299.        umformung(a);
  300.        end
  301.       else
  302.        begin
  303.        hilf:="";            (*                hilf-Generierung     *)
  304.        x:=length(quelle^.wert)+1; (* gleiche Anzahl Zeichen aber     *)
  305.        repeat                     (* Klammerinnenterme fehlen       *)
  306.        x:=x-1;
  307.        if quelle^.wert[x]=")" then
  308.         begin
  309.         auslass:=x;
  310.         x:=klammerrück(quelle,x);
  311.         repeat
  312.         auslass:=auslass-1;
  313.         hilf:=" "+hilf;
  314.         until auslass=x;
  315.    (*    if (quelle^.wert[x]="(")and(x>1) then x:=x-1;*)
  316.         end;
  317.        hilf:=quelle^.wert[x]+hilf;
  318.        until x=1;
  319.        (*writeln("quelle^.wert=",quelle^.wert);
  320.        writeln("        hilf=",hilf);*)
  321.        x:=0;
  322.        xx:=0;
  323.        if pos("e",hilf)>0 then
  324.         begin
  325.         x:=pos("e",hilf);
  326.         xx:=1;
  327.         end;
  328.        if pos("pi",hilf)>0 then
  329.         begin
  330.         x:=pos("pi",hilf);
  331.         xx:=2;
  332.         end;
  333.        if pos("nu",hilf)>0 then
  334.         begin
  335.         x:=pos("nu",hilf);
  336.         xx:=2;
  337.         end;
  338.        if pos("mu",hilf)>0 then
  339.         begin
  340.         x:=pos("mu",hilf);
  341.         xx:=2;
  342.         end;
  343.        if pos("eta",hilf)>0 then
  344.         begin
  345.         x:=pos("eta",hilf);
  346.         xx:=3;
  347.         end;
  348.        if pos("rho",hilf)>0 then
  349.         begin
  350.         x:=pos("rho",hilf);
  351.         xx:=3;
  352.         end;
  353.        if pos("tau",hilf)>0 then
  354.         begin
  355.         x:=pos("tau",hilf);
  356.         xx:=3;
  357.         end;
  358.        if pos("phi",hilf)>0 then
  359.         begin
  360.         x:=pos("phi",hilf);
  361.         xx:=3;
  362.         end;
  363.        if pos("psi",hilf)>0 then
  364.         begin
  365.         x:=pos("psi",hilf);
  366.         xx:=3;
  367.         end;
  368.        if pos("beta",hilf)>0 then
  369.         begin
  370.         x:=pos("beta",hilf);
  371.         xx:=4;
  372.         end;
  373.        if pos("alpha",hilf)>0 then
  374.         begin
  375.         x:=pos("alpha",hilf);
  376.         xx:=5;
  377.         end;
  378.        if pos("gamma",hilf)>0 then
  379.         begin
  380.         x:=pos("gamma",hilf);
  381.         xx:=5;
  382.         end;
  383.        if pos("delta",hilf)>0 then
  384.         begin
  385.         x:=pos("delta",hilf);
  386.         xx:=5;
  387.         end;
  388.        if pos("theta",hilf)>0 then
  389.         begin
  390.         x:=pos("theta",hilf);
  391.         xx:=5;
  392.         end;
  393.        if pos("kappa",hilf)>0 then
  394.         begin
  395.         x:=pos("kappa",hilf);
  396.         xx:=5;
  397.         end;
  398.        if pos("sigma",hilf)>0 then
  399.         begin
  400.         x:=pos("sigma",hilf);
  401.         xx:=5;
  402.         end;
  403.        if pos("epsilon",hilf)>0 then
  404.         begin
  405.         x:=pos("epsilon",hilf);
  406.         xx:=7;
  407.         end;
  408.        (*writeln("an:",x,"lang",xx);*)
  409.        if x>1 then
  410.         begin
  411.         new(a);
  412.         new(b);
  413.         a^.wert:=copy(quelle^.wert,1,x-1);
  414.         a^.a:=nil;
  415.         a^.b:=nil;
  416.         b^.wert:=copy(quelle^.wert,x,length(quelle^.wert)-x+1);
  417.         b^.a:=nil;
  418.         b^.b:=nil;
  419.         quelle^.wert:="*";
  420.         quelle^.a:=a;
  421.         quelle^.b:=b;
  422.         (*writeln("ab",a^.wert,":",b^.wert);*)
  423.         umformung(a);
  424.         umformung(b);
  425.         end;
  426.        if (x=1)and(length(quelle^.wert)>xx) then
  427.         begin
  428.         new(a);
  429.         new(b);
  430.         a^.wert:=copy(quelle^.wert,1,xx);
  431.         a^.a:=nil;
  432.         a^.b:=nil;
  433.         b^.wert:=copy(quelle^.wert,xx+1,length(quelle^.wert)-xx);
  434.         b^.a:=nil;
  435.         b^.b:=nil;
  436.         quelle^.wert:="*";
  437.         quelle^.a:=a;
  438.         quelle^.b:=b;
  439.         umformung(b);
  440.         end;
  441.        (*writeln("bis hier?",hilf);*)
  442.        x:=0;
  443.        xx:=0;
  444.        if pos("ln",hilf)>0 then
  445.         begin
  446.         x:=pos("ln",hilf);
  447.         xx:=2;
  448.         end;
  449.        if pos("sin",hilf)>0 then
  450.         begin
  451.         x:=pos("sin",hilf);
  452.         xx:=3;
  453.         end;
  454.        if pos("cos",hilf)>0 then
  455.         begin
  456.         x:=pos("cos",hilf);
  457.         xx:=3;
  458.         end;
  459.        if pos("tan",hilf)>0 then
  460.         begin
  461.         x:=pos("tan",hilf);
  462.         xx:=3;
  463.         end;
  464.        if pos("sqr",hilf)>0 then
  465.         begin
  466.         x:=pos("sqr",hilf);
  467.         xx:=3;
  468.         end;
  469.        if pos("tanh",hilf)>0 then
  470.         begin
  471.         x:=pos("tanh",hilf);
  472.         xx:=4;
  473.         end;
  474.        if pos("arcsin",hilf)>0 then
  475.         begin
  476.         x:=pos("arcsin",hilf);
  477.         xx:=6;
  478.         end;
  479.        if pos("arccos",hilf)>0 then
  480.         begin
  481.         x:=pos("arccos",hilf);
  482.         xx:=6;
  483.         end;
  484.        if pos("arctan",hilf)>0 then
  485.         begin
  486.         x:=pos("arctan",hilf);
  487.         xx:=6;
  488.         end;
  489.        if x>1 then
  490.         begin
  491.         new(a);
  492.         new(b);
  493.         a^.wert:=copy(quelle^.wert,1,x-1);
  494.         a^.a:=nil;
  495.         a^.b:=nil;
  496.         b^.wert:=copy(quelle^.wert,x,length(quelle^.wert)-x+1)
  497.         b^.a:=nil;
  498.         b^.b:=nil;
  499.         quelle^.wert:="*";
  500.         quelle^.a:=a;
  501.         quelle^.b:=b;
  502.         (*writeln("jetzt umformung(a)",a^.wert,":",b^.wert);*)
  503.         umformung(a);
  504.         (*writeln("jetzt umformung(b)");*)
  505.         umformung(b);
  506.         end
  507.        else
  508.         begin
  509.         (*write("marke1");*)
  510.         t:=length(quelle^.wert);
  511.         if x=1 then
  512.          begin
  513.          if quelle^.wert[x+xx]="(" then t:=klammervor(quelle,x+xx);
  514.          if t=length(quelle^.wert) then
  515.           begin
  516.           new(a);
  517. (*   funktion(ausdruck)       *)
  518.           a^.wert:=copy(quelle^.wert,xx+1,length(quelle^.wert)-xx);
  519.           a^.a:=nil;
  520.           a^.b:=nil;
  521.           quelle^.wert:=copy(quelle^.wert,1,xx);
  522.           quelle^.a:=a;
  523.           umformung(a);
  524.           end
  525.          else
  526.           begin
  527.           new(a);
  528.           new(b);                            (* sonst funktion(ausdruck)ausdruck  *)
  529.           a^.wert:=copy(quelle^.wert,1,t);
  530.           a^.a:=nil;
  531.           a^.b:=nil;
  532.           b^.wert:=copy(quelle^.wert,t+1,length(quelle^.wert)-t);
  533.           b^.a:=nil;
  534.           b^.b:=nil;
  535.           quelle^.wert:="*";
  536.           quelle^.a:=a;
  537.           quelle^.b:=b;
  538.           umformung(a);
  539.           umformung(b);
  540.           end;
  541.          end
  542.         else
  543.          begin
  544.          (*write("marke2");*)
  545.          if quelle^.wert[1]="(" then
  546.           begin
  547.           x:=klammervor(quelle,1);
  548.           if x<length(quelle^.wert) then
  549.            begin
  550.            new(a);
  551.            new(b);
  552.            a^.wert:=copy(quelle^.wert,2,x-2);
  553.            a^.a:=nil;
  554.            a^.b:=nil;
  555.            b^.wert:=copy(quelle^.wert,x+1,length(quelle^.wert)-x);
  556.            b^.a:=nil;
  557.            b^.b:=nil;
  558.            quelle^.wert:="*";
  559.            quelle^.a:=a;
  560.            quelle^.b:=b;
  561.            umformung(a);
  562.            umformung(b);
  563.            end
  564.           else
  565.            begin
  566.            quelle^.wert:=copy(quelle^.wert,2,length(quelle^.wert)-2);
  567.            umformung(quelle);
  568.            end;
  569.           end;
  570.          end;
  571.         end;
  572.        end;
  573.       end;
  574.      end
  575.     else
  576.      begin
  577. (* An dieser Stelle muss quelle^.wert ein "x" enthalten    *)
  578.      end
  579.     end;
  580.    end;
  581.   end;
  582.  end;
  583. end;
  584.  
  585.  
  586. procedure _ausgabe;
  587. var v:integer;
  588. begin
  589. j:=j+1;
  590. if q^.wert="/" then jj:=jj+"{";
  591. if (q^.a<>nil)and(q^.b<>nil)and((prior(q^.a,1)<prior(q,1))or((prior(q^.a,1)=3)and(prior(q,1)=3))or((q^.wert="^")and(q^.a^.wert="sqr")))then
  592. begin
  593. ausgabe:=ausgabe+"(";
  594. if q^.wert<>"/"then jj:=jj+"{\left(";        (*   linke Klammer setzen    *)
  595. k:=k+1;
  596. end;
  597. if (q^.a<>nil)and(q^.b<>nil) then _ausgabe(q^.a);
  598. if (q^.a<>nil)and(q^.b<>nil)and((prior(q^.a,1)<prior(q,1))or((prior(q^.a,1)=3)and(prior(q,1)=3))or((q^.wert="^")and(q^.a^.wert="sqr")))then
  599. begin
  600. ausgabe:=ausgabe+")";
  601. if q^.wert<>"/"then jj:=jj+"\right)}";       (*    rechte Klammer setzen  *)
  602. k:=k+1;
  603. end;
  604. k:=k+length(q^.wert);
  605. ausgabe:=ausgabe+q^.wert;
  606. if "pi"=q^.wert then jj:=jj+"\pi"
  607. else if "eta"=q^.wert then jj:=jj+"\eta"
  608. else if "ln"=q^.wert then jj:=jj+"\ln"
  609. else if "sin"=q^.wert then jj:=jj+"\sin"
  610. else if "cos"=q^.wert then jj:=jj+"\cos"
  611. else if "tan"=q^.wert then jj:=jj+"\tan"
  612. else if "sqr"=q^.wert then jj:=jj+"\sqrt{"
  613. else if "/"=q^.wert then jj:=jj+"\over "
  614. else if "*"=q^.wert then jj:=jj+"\cdot "
  615. else if "a"=q^.wert then jj:=jj
  616. else if "arccos"=q^.wert then jj:=jj+"\arccos"
  617. else if "arcsin"=q^.wert then jj:=jj+"\arcsin"
  618. else if "arctan"=q^.wert then jj:=jj+"\arctan"
  619. else if "tanh"=q^.wert then jj:=jj+"\tanh"
  620. else if "rho"=q^.wert then jj:=jj+"\rho"
  621. else if "tau"=q^.wert then jj:=jj+"\tau"
  622. else if "phi"=q^.wert then jj:=jj+"\phi"
  623. else if "psi"=q^.wert then jj:=jj+"\psi"
  624. else if "epsilon"=q^.wert then jj:=jj+"\epsilon"
  625. else if "gamma"=q^.wert then jj:=jj+"\gamma"
  626. else if "delta"=q^.wert then jj:=jj+"\delta"
  627. else if "beta"=q^.wert then jj:=jj+"\beta"
  628. else if "theta"=q^.wert then jj:=jj+"\theta"
  629. else if "lambda"=q^.wert then jj:=jj+"\lambda"
  630. else if "kappa"=q^.wert then jj:=jj+"\kappa"
  631. else if "sigma"=q^.wert then jj:=jj+"\sigma"
  632. else if "omega"=q^.wert then jj:=jj+"\omega"
  633. else if "alpha"=q^.wert then jj:=jj+"\alpha"
  634. else jj:=jj+q^.wert;
  635. if (q^.a<>nil)and(q^.b=nil)and(not((prior(q,1)=1)and(prior(q^.a,1)<>1)))then
  636. begin
  637. ausgabe:=ausgabe+"(";
  638. if q^.wert<>"sqr" then jj:=jj+"{\left(";  (*  linke Klammer setzen  *)
  639. k:=k+1;
  640. end;
  641. if (q^.a<>nil)and(q^.b=nil) then _ausgabe(q^.a);
  642. if (q^.a<>nil)and(q^.b=nil)and(not((prior(q,1)=1)and(prior(q^.a,1)<>1)))then
  643. begin
  644. ausgabe:=ausgabe+")";
  645. if q^.wert="sqr" then jj:=jj+"}";
  646. if q^.wert<>"sqr" then jj:=jj+"\right)}"; (*  rechte Klammer setzen  *)
  647. if q^.wert="a" then jj:=jj+"^\prime";
  648. k:=k+1;
  649. end;
  650. if (q^.b<>nil) and (prior(q^.b,1)<prior(q,1))then
  651. begin
  652. ausgabe:=ausgabe+"(";
  653. if q^.wert<>"/"then jj:=jj+"{\left(";
  654. k:=k+1;
  655. end;
  656. if q^.b<>nil then _ausgabe(q^.b);
  657. if (q^.b<>nil) and (prior(q^.b,1)<prior(q,1))then
  658. begin
  659. ausgabe:=ausgabe+")";
  660. if q^.wert<>"/" then jj:=jj+"\right)}";
  661. k:=k+1;
  662. end;
  663. if q^.wert="/" then jj:=jj+"}";
  664. j:=j-1;
  665. ausgabe[k+1]:=chr(0);
  666. end;
  667.  
  668. function kopie(var i:zeiger):zeiger;
  669. var j:zeiger
  670. begin
  671. new(j);
  672. j^.wert:=i^.wert;
  673. if i^.a<>nil then j^.a:=kopie(i^.a)
  674. else j^.a:=nil;
  675. if i^.b<>nil then j^.b:=kopie(i^.b)
  676. else j^.b:=nil;
  677. kopie:=j;
  678. end;
  679.  
  680. procedure ableinf(var p:zeiger);
  681. var h:zeiger;
  682. begin
  683. new(h);
  684. h^.wert:=p^.wert;
  685. p^.wert:="a";
  686. h^.a:=p^.a;
  687. h^.b:=p^.b;
  688. p^.a:=h;
  689. p^.b:=nil;
  690. end;
  691.  
  692. procedure ablaust(var p:zeiger);
  693. var h:zeiger;
  694. begin
  695. h:=p;
  696. p:=p^.a;
  697. dispose(h);
  698. end;
  699.  
  700. procedure kill(var q:zeiger); (*  q darf nicht nil sein!!! *)
  701. begin
  702. (*writeln("kill:",q^.wert);*)
  703. if q^.a<>nil then kill(q^.a);
  704. if q^.b<>nil then kill(q^.b);
  705. if (q^.a=nil)and(q^.b=nil) then
  706.  begin
  707.  dispose(q);
  708. (* writeln("Erfolg!!");*)
  709.  q:=nil;
  710.  end;
  711. end;
  712.  
  713. function vergleich(var q1,q2:zeiger):integer;
  714. var h:integer;
  715. begin
  716. h:=0;
  717. if (q1=nil)or(q2=nil) then
  718.  begin
  719.  if q1=q2 then h:=1
  720.  else h:=0;
  721.  end
  722. else
  723.  begin
  724.  if q1^.wert=q2^.wert then
  725.   begin
  726.   h:=1;
  727.   h:=h*vergleich(q1^.a,q2^.a);
  728.   h:=h*vergleich(q1^.b,q2^.b);
  729.   end;
  730.  end;
  731. vergleich:=h;
  732. end;
  733.  
  734. procedure _vereinfachen(var quelle:zeiger);
  735. var h:zeiger;
  736. begin
  737. (*write("ve",quelle^.wert);
  738. if quelle=nil then write("nil!!");
  739. if quelle^.a=nil then write("anil!");
  740. if quelle^.b=nil then write("bnil!");*)
  741. if (quelle^.wert<>"")and(quelle^.a<>nil) then
  742. begin
  743. (*writeln("nun kommen wir zum vereinfachenden Teil",quelle^.wert);*)
  744.  gnot:=gnot+1;
  745.  (*if quelle^.a=nil then write("a2nil!");
  746.  if quelle^.b=nil then write("b2nil!");*)
  747.  if (quelle^.wert="-")and(vergleich(quelle^.a,quelle^.b)=1) then
  748.   begin
  749.   kill(quelle^.a);
  750.   kill(quelle^.b);
  751.   quelle^.wert:="0";
  752.   quelle^.a:=nil;
  753.   quelle^.b:=nil;
  754.   ausgeben(wurzel);
  755.   schalter:=1;
  756.   end;
  757.  if (quelle^.wert="/")and(vergleich(quelle^.a,quelle^.b)=1) then
  758.   begin
  759.   kill(quelle);
  760.   new(quelle);
  761.   quelle^.wert:="1";
  762.   quelle^.a:=nil;
  763.   quelle^.b:=nil;
  764.   ausgeben(wurzel);
  765.   schalter:=1;
  766.   end;
  767.  (*write("stufe:",gnot);
  768.  if quelle^.a<>nil then write("nil<>a");
  769.  if quelle^.b<>nil then writeln("nil<>b");*)
  770.  if (quelle^.wert="*")or(quelle^.wert="^")then  (*  falls nicht ende des baums *)
  771.   begin
  772.   if quelle^.a^.wert="0" then         (*            0*ausdruck        *)
  773.    begin                             (*            0^ausdruck        *)
  774.    kill(quelle^.a);
  775.    kill(quelle^.b);
  776.    quelle^.wert:="0";
  777.    (*writeln("0*^ausdruck");*)
  778.    ausgeben(wurzel);
  779.    schalter:=1;
  780.    end;
  781.   if quelle^.b^.wert="1" then         (*            ausdruck*1        *)
  782.    begin                             (*            ausdruck^1        *)
  783.    quelle^.wert:=quelle^.a^.wert;
  784.    kill(quelle^.b);
  785.    h:=quelle^.a;
  786.    quelle^.b:=quelle^.a^.b;
  787.    quelle^.a:=quelle^.a^.a;
  788.    dispose(h);
  789.    (*writeln("ausdruck*^1");*)
  790.    ausgeben(wurzel);
  791.    schalter:=1;
  792.    end;
  793.   if (quelle^.a^.wert="1")and(quelle^.wert="*") then (* 1*ausdruck   *)
  794.    begin
  795.    quelle^.wert:=quelle^.b^.wert;
  796.    kill(quelle^.a);
  797.    h:=quelle^.b;
  798.    quelle^.a:=quelle^.b^.a;
  799.    quelle^.b:=quelle^.b^.b;
  800.    dispose(h);
  801.    (*writeln("1*ausdruck");*)
  802.    ausgeben(wurzel);
  803.    schalter:=1;
  804.    end;
  805.   if (quelle^.a^.wert="1")and(quelle^.wert="^") then (* 1^ausdruck   *)
  806.    begin
  807.    quelle^.wert:=quelle^.a^.wert;
  808.    kill(quelle^.b);
  809.    h:=quelle^.a;
  810.    quelle^.b:=quelle^.a^.b;
  811.    quelle^.a:=quelle^.a^.b;
  812.    dispose(h);
  813.     (*writeln("1^ausdruck");*)
  814.    ausgeben(wurzel);
  815.    schalter:=1;
  816.    end;
  817.   if (quelle^.wert="*")and(quelle^.b^.wert="0") then (* ausdruck*0   *)
  818.    begin
  819.    kill(quelle^.a);
  820.    kill(quelle^.b);
  821.    quelle^.wert:="0";
  822.    (*writeln("ausdruck*0");*)
  823.    ausgeben(wurzel);
  824.    schalter:=1;
  825.    end;
  826.   if (quelle^.wert="^")and(quelle^.b^.wert="0") then (* ausdruck^0   *)
  827.    begin
  828.    kill(quelle^.a);
  829.    kill(quelle^.b);
  830.    quelle^.wert:="1";
  831.   (*writeln("ausdruck^0");*)
  832.    ausgeben(wurzel);
  833.    schalter:=1;
  834.    end;
  835.   end;
  836.  if (quelle^.wert="/")and(quelle^.a^.wert="0") then (* 0/ausdruck  *)
  837.   begin
  838.   kill(quelle);
  839.   new(quelle);
  840.   quelle^.wert:="0";
  841.   quelle^.a:=nil;
  842.   quelle^.b:=nil;
  843.  (*writeln("0/ausdruck");*)
  844.   ausgeben(wurzel);
  845.   schalter:=1;
  846.   end;
  847.  if (prior(quelle,1)=1) then
  848.   begin
  849.   if(quelle^.a^.wert="0")and(quelle^.b<>nil) then    (*  0+ausdruck *)
  850.    begin
  851.    kill(quelle^.a);
  852.    quelle^.a:=quelle^.b;
  853.    quelle^.b:=nil;
  854.   (*writeln("0+ausdruck");*)
  855.    ausgeben(wurzel);
  856.    schalter:=1;
  857.    end;
  858.   end;
  859.  if (prior(quelle,1)=1)and(quelle^.b<>nil) then
  860.   begin
  861.   if(quelle^.b^.wert="0") then                   (* ausdruck+0  *)
  862.    begin
  863.    quelle^.wert:=quelle^.a^.wert;
  864.    kill(quelle^.b);
  865.    if quelle^.b<>nil then writeln("fehler-hier nicht genilt - warum?");
  866.    h:=quelle^.a;
  867.    quelle^.b:=quelle^.a^.b;
  868.    quelle^.a:=quelle^.a^.a;
  869.    dispose(h);
  870. (*   writeln("ausdruck+0");*)
  871.    ausgeben(wurzel);
  872.    schalter:=1;
  873.    end;
  874.   end;
  875.  if quelle^.a<>nil then
  876.  begin
  877. (* writeln("a<>nil");*)
  878.  _vereinfachen(quelle^.a);
  879.  end;
  880.  if quelle^.b<>nil then
  881.  begin
  882. (* writeln("b<>nil");*)
  883.  _vereinfachen(quelle^.b);
  884.  end;
  885.  gnot:=gnot-1;
  886. end;
  887. end;
  888.  
  889. procedure vereinfachen(var p:zeiger);
  890. begin
  891. repeat
  892. schalter:=0;
  893. zurückformen(wurzel);
  894. kill(wurzel);
  895. new(wurzel);
  896. wurzel^.wert:=ausgabe;
  897. wurzel^.a:=nil;
  898. wurzel^.b:=nil;
  899. überprüfen(wurzel);
  900. umformung(wurzel);
  901. _vereinfachen(wurzel);
  902. until schalter=0;
  903. end;
  904.  
  905. procedure ableitung(var p:zeiger);
  906. var a:array[1..10] of zeiger;
  907.     s:string[999];
  908.     v:integer;
  909. begin
  910. if (prior(p,1)=1)and(p^.b<>nil) then      (*         summenregel             *)
  911.  begin
  912.  ableinf(p^.a);
  913.  ableinf(p^.b);
  914.  erlaeut:="Summenformel";
  915.  ausgeben(wurzel);
  916.  erlaeut:="";
  917.  ablaust(p^.a);
  918.  if xabh(p^.a)<>0 then
  919.   begin
  920.   ableitung(p^.a);
  921.   end
  922.  else
  923.   begin
  924.   kill(p^.a);
  925.   new(p^.a);
  926.   p^.a^.wert:="0";
  927.   p^.a^.a:=nil;
  928.   p^.a^.b:=nil;
  929.   end;
  930.  ablaust(p^.b);
  931.  if xabh(p^.b)<>0 then
  932.   begin
  933.   ableitung(p^.b);
  934.   end
  935.  else
  936.   begin
  937.   kill(p^.b);
  938.   new(p^.b);
  939.   p^.b^.wert:="0";
  940.   p^.b^.a:=nil;
  941.   p^.b^.b:=nil;
  942.   end;
  943.  end;
  944. if (prior(p,1)=1)and(p^.b=nil) then ableitung(p^.a);
  945. if p^.wert="*" then     (*        produktregel             *)
  946.  begin
  947.  if (xabh(p^.a)<>0)and(xabh(p^.b)<>0) then
  948.   begin
  949.   new(a[1]);
  950.   new(a[2]);
  951.   a[1]^.a:=kopie(p^.a);  (*           p^.wert                *)
  952.   ableinf(a[1]^.a);      (*           /       \              *)
  953.   a[1]^.wert:="*";       (*    a[1]^.wert      a[2]^.wert    *)
  954.   a[1]^.b:=p^.b;         (*   /     \            /     \     *)
  955.   p^.wert:="+";          (*  /       \          /       \    *)
  956.   a[2]^.a:=p^.a;       (* a[1]^.a  a[1]^.b   a[2]^.a  a[2]^.b *)
  957.   a[2]^.wert:="*";
  958.   a[2]^.b:=kopie(p^.b);
  959.   ableinf(a[2]^.b);
  960.   p^.a:=a[1];
  961.   p^.b:=a[2];
  962.   erlaeut:="Produktregel";
  963.   ausgeben(wurzel);
  964.   erlaeut:="";
  965.   ablaust(a[1]^.a);
  966.   ableitung(a[1]^.a);
  967.   ablaust(a[2]^.b);
  968.   ableitung(a[2]^.b);
  969.   end
  970.   else
  971.   begin
  972.   if xabh(p^.a)<>0 then
  973.    begin
  974.    ableinf(p^.a);
  975.    ausgeben(wurzel);
  976.    ablaust(p^.a);
  977.    ableitung(p^.a);
  978.    end
  979.    else
  980.    begin
  981.    if xabh(p^.b)<>0 then
  982.     begin
  983.     ableinf(p^.b);
  984.     ausgeben(wurzel);
  985.     ablaust(p^.b);
  986.     ableitung(p^.b);
  987.     end
  988.     else
  989.     begin
  990.     ableinf(p);
  991.     erlaeut:="konst.";
  992.     ausgeben(wurzel);
  993.     erlaeut:="";
  994.     ablaust(p);
  995.     kill(p);
  996.     new(p);
  997.     p^.wert:="0";
  998.     p^.a:=nil;
  999.     p^.b:=nil;
  1000.     end;
  1001.    end;
  1002.   end;
  1003.  end;
  1004. if p^.wert="/" then    (*          quotientenregel          *)
  1005.   begin
  1006.   if (xabh(p^.a)<>0)and(xabh(p^.b)<>0) then
  1007.   begin
  1008.    new(a[1]);
  1009.    new(a[2]);
  1010.    new(a[3]);
  1011.    new(a[4]);
  1012.    new(a[5]);
  1013.    a[1]^.a:=kopie(p^.a);
  1014.    ableinf(a[1]^.a);
  1015.    a[1]^.wert:="*";
  1016.    a[1]^.b:=p^.b;
  1017.    a[2]^.a:=p^.a;
  1018.    a[2]^.wert:="*";
  1019.    a[2]^.b:=kopie(p^.b);
  1020.    ableinf(a[2]^.b);
  1021.    a[5]^.a:=a[1];
  1022.    a[5]^.wert:="-";
  1023.    a[5]^.b:=a[2];
  1024.    a[3]^.a:=kopie(p^.b);
  1025.    a[3]^.wert:="^";
  1026.    a[3]^.b:=a[4];
  1027.    a[4]^.a:=nil;
  1028.    a[4]^.wert:="2";
  1029.    a[4]^.b:=nil;
  1030.    p^.a:=a[5];
  1031.    p^.b:=a[3];
  1032.    erlaeut:="Quotientenregel";
  1033.    ausgeben(wurzel);
  1034.    erlaeut:="";
  1035.    ablaust(a[1]^.a);
  1036.    ableitung(a[1]^.a);
  1037.    ablaust(a[2]^.b);
  1038.    ableitung(a[2]^.b);
  1039.   end
  1040.   else
  1041.   begin
  1042.    if xabh(p^.a)<>0 then
  1043.    begin
  1044.     ableinf(p^.a);
  1045.     ausgeben(wurzel);
  1046.     ablaust(p^.a);
  1047.     ableitung(p^.a);
  1048.    end
  1049.    else
  1050.    begin
  1051.     if xabh(p^.b)<>0 then
  1052.     begin
  1053.     new(a[1]);
  1054.     new(a[2]);
  1055.     new(a[3]);
  1056.     new(a[4]);
  1057.     a[1]^.wert:="*";
  1058.     a[1]^.b:=kopie(p^.b);
  1059.     a[1]^.a:=p^.a;
  1060.     a[2]^.wert:="/";
  1061.     a[2]^.a:=a[1];
  1062.     a[2]^.b:=a[3];
  1063.     a[3]^.wert:="^";
  1064.     a[3]^.a:=p^.b;
  1065.     a[3]^.b:=a[4];
  1066.     a[4]^.wert:="2";
  1067.     a[4]^.a:=nil;
  1068.     a[4]^.b:=nil;
  1069.     p^.wert:="-";
  1070.     p^.a:=a[2];
  1071.     p^.b:=nil;
  1072.     ableinf(a[1]^.b);
  1073.     ausgeben(wurzel);
  1074.     ablaust(a[1]^.b);
  1075.     ableitung(a[1]^.b);
  1076.     end
  1077.    else
  1078.     begin
  1079.     ableinf(p);
  1080.     ausgeben(wurzel);
  1081.     ablaust(p);
  1082.     kill(p);
  1083.     new(p);
  1084.     p^.wert:="0";
  1085.     p^.a:=nil;
  1086.     p^.b:=nil;
  1087.     end;
  1088.    end;
  1089.   end;
  1090.  end;
  1091. if p^.wert="^" then                 (*       potenzregel          *)
  1092.  begin
  1093.  if (p^.a^.wert="x")and(xabh(p^.b)=0) then (*  x^konst.      *)
  1094.   begin
  1095.   new(a[1]);
  1096.   p^.wert:="*";
  1097.   a[1]^.wert:="^";
  1098.   a[1]^.a:=p^.a;
  1099.   new(a[3]);
  1100.   a[3]^.wert:="1";
  1101.   a[3]^.a:=nil;
  1102.   a[3]^.b:=nil;
  1103.   new(a[4]);
  1104.   a[4]^.wert:="-";
  1105.   a[4]^.a:=p^.b;
  1106.   a[4]^.b:=a[3];
  1107.   a[1]^.b:=a[4];
  1108.   a[2]:=kopie(p^.b);
  1109.   p^.a:=a[2];
  1110.   p^.b:=a[1];
  1111.   erlaeut:="einf.Potenzreg.";
  1112.   ausgeben(wurzel);
  1113.   erlaeut:="";
  1114.   end
  1115.  else
  1116.   begin
  1117.   if (xabh(p^.a)=0)and(xabh(p^.b)<>0) then
  1118.    begin            (* konst^g(x) *)
  1119.    new(a[1]);
  1120.    new(a[2]);
  1121.    new(a[3]);
  1122.    a[1]^.wert:="^";
  1123.    a[1]^.a:=p^.a;
  1124.    a[1]^.b:=p^.b;
  1125.    a[2]^.wert:="*";
  1126.    a[2]^.a:=kopie(p^.b);
  1127.    a[2]^.b:=a[3];
  1128.    a[3]^.wert:="ln";
  1129.    a[3]^.a:=kopie(p^.a);
  1130.    a[3]^.b:=nil;
  1131.    p^.wert:="*";
  1132.    p^.a:=a[1];
  1133.    p^.b:=a[2];
  1134.    ableinf(a[2]^.a);
  1135.    erlaeut:="$konst.^{f(x)}$";
  1136.    ausgeben(wurzel);
  1137.    erlaeut:="";
  1138.    ablaust(a[2]^.a);
  1139.    ableitung(a[2]^.a);
  1140.    end
  1141.   else
  1142.    begin   (* f(x)^konst.    *)
  1143.    if (xabh(p^.a)<>0)and(xabh(p^.b)=0) then
  1144.     begin
  1145.     new(a[1]);
  1146.     new(a[2]);
  1147.     new(a[3]);
  1148.     new(a[4]);
  1149.     a[1]^.wert:="^";
  1150.     a[1]^.a:=p^.a;
  1151.     a[1]^.b:=a[3];
  1152.     a[2]^.wert:="*";
  1153.     a[2]^.a:=kopie(p^.b);
  1154.     a[2]^.b:=kopie(p^.a);
  1155.     a[3]^.wert:="-";
  1156.     a[3]^.a:=p^.b;
  1157.     a[3]^.b:=a[4];
  1158.     a[4]^.wert:="1";
  1159.     a[4]^.a:=nil;
  1160.     a[4]^.b:=nil;
  1161.     p^.wert:="*";
  1162.     p^.a:=a[1];
  1163.     p^.b:=a[2];
  1164.     ableinf(a[2]^.b);
  1165.     erlaeut:="$f(x)^{konst}$";
  1166.     ausgeben(wurzel);
  1167.     erlaeut:="";
  1168.     ablaust(a[2]^.b);
  1169.     ableitung(a[2]^.b);
  1170.     end
  1171.    else
  1172.     begin
  1173.     v:=2;                       (* f(x)^g(x)       *)
  1174.     repeat
  1175.      new(a[v]);
  1176.      v:=v+1;
  1177.     until v=11;
  1178.     p^.wert:="*";
  1179.     a[2]^.a:=p^.a;
  1180.     a[2]^.wert:="^";
  1181.     a[2]^.b:=p^.b;
  1182.     a[6]^.a:=a[7];
  1183.     a[6]^.wert:="+";
  1184.     a[6]^.b:=a[9];
  1185.     a[7]^.a:=kopie(p^.b);
  1186.     ableinf(a[7]^.a);
  1187.     a[7]^.wert:="*";
  1188.     a[7]^.b:=a[8];
  1189.     a[8]^.a:=kopie(p^.a);
  1190.     a[8]^.wert:="ln";
  1191.     a[8]^.b:=nil;
  1192.     a[9]^.a:=a[10];
  1193.     a[9]^.wert:="*";
  1194.     a[9]^.b:=kopie(p^.a);
  1195.     ableinf(a[9]^.b);
  1196.     a[10]^.a:=kopie(p^.b);
  1197.     a[10]^.wert:="/";
  1198.     a[10]^.b:=kopie(p^.a);
  1199.     p^.a:=a[2];
  1200.     p^.b:=a[6];
  1201.     erlaeut:="Potenz.-regel";
  1202.     ausgeben(wurzel);
  1203.     erlaeut:="";
  1204.     ablaust(a[7]^.a);
  1205.     ableitung(a[7]^.a);
  1206.     ablaust(a[9]^.b);
  1207.     ableitung(a[9]^.b);
  1208.    end;
  1209.   end;
  1210.  end;
  1211. end;
  1212. if prior(p,1)=4 then
  1213.  begin
  1214.  if p^.wert="x" then        (*           x           *)
  1215.   begin
  1216.   p^.wert:="1";
  1217.   p^.a:=nil;
  1218.   p^.b:=nil;
  1219.   end
  1220.  else
  1221.   begin
  1222.   if p^.wert="sin"then      (*         sin           *)
  1223.    begin
  1224.    new(a[1]);
  1225.    a[1]^.a:=p^.a;
  1226.    a[1]^.wert:="cos";
  1227.    a[1]^.b:=nil;
  1228.    p^.a:=a[1];
  1229.    p^.wert:="*";
  1230.    p^.b:=kopie(a[1]^.a);
  1231.    ableinf(p^.b);
  1232.    erlaeut:="Sinus-abl";
  1233.    ausgeben(wurzel);
  1234.    erlaeut:="";
  1235.    ablaust(p^.b);
  1236.    ableitung(p^.b);
  1237.    end
  1238.   else
  1239.    begin
  1240.    if p^.wert="cos"then     (*          cos        *)
  1241.     begin
  1242.     new(a[1]);
  1243.     a[1]^.a:=p^.a;
  1244.     a[1]^.wert:="sin";
  1245.     a[1]^.b:=nil;
  1246.     new(a[2]);
  1247.     a[2]^.a:=a[1];
  1248.     a[2]^.wert:="-";
  1249.     a[2]^.b:=nil;
  1250.     p^.a:=a[2];
  1251.     p^.wert:="*";
  1252.     p^.b:=kopie(a[1]^.a);
  1253.     ableinf(p^.b);
  1254.     erlaeut:="Cosinus-abl.";
  1255.     ausgeben(wurzel);
  1256.     erlaeut:="";
  1257.     ablaust(p^.b);
  1258.     ableitung(p^.b);
  1259.     end
  1260.    else
  1261.     begin
  1262.     if p^.wert="ln"then        (*        ln           *)
  1263.      begin
  1264.      p^.b:=kopie(p^.a);
  1265.      p^.wert:="/";
  1266.      ableinf(p^.a);
  1267.      erlaeut:="Log.nat.-regel";
  1268.      ausgeben(wurzel);
  1269.      erlaeut:="";
  1270.      ablaust(p^.a);
  1271.      ableitung(p^.a);
  1272.      end
  1273.     else
  1274.      begin
  1275.      if p^.wert="sqr"then     (*          sqr          *)
  1276.       begin
  1277.       p^.wert:="/";
  1278.       new(a[1]);
  1279.       p^.b:=a[1];
  1280.       a[1]^.wert:="*";
  1281.       new(a[2]);
  1282.       a[1]^.a:=a[2];
  1283.       a[1]^.b:=kopie(p^.a);
  1284.       a[2]^.wert:="2";
  1285.       a[2]^.a:=nil;
  1286.       a[2]^.b:=nil;
  1287.       ableinf(p^.a);
  1288.       erlaeut:="Wurzel-regel";
  1289.       ausgeben(wurzel);
  1290.       erlaeut:="";
  1291.       ablaust(p^.a);
  1292.       ableitung(p^.a);
  1293.       end
  1294.      else
  1295.       begin
  1296.       if p^.wert="tan" then    (*        tan            *)
  1297.        begin
  1298.        new(a[1]);
  1299.        new(a[2]);
  1300.        new(a[3]);
  1301.        p^.wert:="/";
  1302.        p^.b:=a[1];
  1303.        a[1]^.wert:="^";
  1304.        a[1]^.a:=a[2];
  1305.        a[1]^.b:=a[3];
  1306.        a[2]^.wert:="cos";
  1307.        a[2]^.a:=kopie(p^.a);
  1308.        a[2]^.b:=nil;
  1309.        a[3]^.wert:="2";
  1310.        a[3]^.a:=nil;
  1311.        a[3]^.b:=nil;
  1312.        ableinf(p^.a);
  1313.        erlaeut:="Tangens-abl";
  1314.        ausgeben(wurzel);
  1315.        erlaeut:="";
  1316.        ablaust(p^.a);
  1317.        ableitung(p^.a);
  1318.        end
  1319.       else
  1320.        begin
  1321.        p^.wert:="0";            (*          konst         *)
  1322.        p^.a:=nil;
  1323.        p^.b:=nil;
  1324.        end;
  1325.       end;
  1326.      end;
  1327.     end;
  1328.    end;
  1329.   end;
  1330.  end;
  1331. end;
  1332.  
  1333. function value(p:zeiger):integer;
  1334. begin
  1335. end;
  1336.  
  1337. begin
  1338. if FromWB then
  1339.  begin
  1340.   Assign(input,"con:0/0/640/120/Matheknecht");
  1341.   reset(input);
  1342.   output:=input;
  1343.  end;
  1344. openlib(reqbase,"req.library",0);
  1345. FReq:=Filerequester(0,"",nil,nil,nil,nil,0,15,35,10,0,3,1,3,3,1,2,1,
  1346. 1,1,1,1,1,1,chr(0),datestamp(0,0,0),0,0,0,0,nil,"","",0,0,0,0,0,0,0,0,
  1347. nil,nil,nil,"",nil,0,0,0,0);
  1348. gnot:=0;
  1349. erlaeut:="";
  1350. FReq.Title:="Wohin mit dem LaTeX-File?";
  1351. dir:="ram:";
  1352. FReq.Dirname:=^dir;
  1353. datei:="abl.tex";
  1354. FReq.Filename:=^datei;
  1355. pfad:="";
  1356. FReq.Pathname:=^pfad;
  1357. FReq.Flags:=FRQloading;
  1358. clrscr;
  1359. write("Matheknecht");
  1360. writeln("von Carsten Hammer Version0.976");
  1361. writeln("Schwindstr.7");
  1362. writeln("48 Bielefeld 1");
  1363. new(wurzel);
  1364. ausgabe:="";
  1365. (*eingabe:="ln(sqr(x/2))+x^2"; *)
  1366. repeat
  1367. write("F(x)=");
  1368. readln(eingabe);
  1369. until eingabe<>"";
  1370. wurzel^.wert:=eingabe;
  1371. wurzel^.a:=nil;
  1372. wurzel^.b:=nil;
  1373. überprüfen(wurzel);
  1374. writeln("Eingabe vorerst in Ordnung:",wurzel^.wert);
  1375. umformung(wurzel);
  1376. Erfolg:=FileRequest(^FReq);
  1377. if Erfolg<>0 then
  1378. begin
  1379. rewrite(f,pfad)
  1380. writeln(f,"\documentstyle[12pt]{article}");
  1381. (*writeln(f,"\textwidth8in \textheigth30cm");
  1382. writeln(f,"\topmargin0in \headheight0in \headsep0in");
  1383. writeln(f,"\evensidemargin0in \oddsidemargin0in");*)
  1384. writeln(f,"\begin{document}");
  1385. writeln(f,"Folgende Funktion differenziere ich nach x:");
  1386. ausgeben(wurzel);
  1387. writeln(f,"Nu ma los!!");
  1388. ableitung(wurzel);
  1389. vereinfachen(wurzel);
  1390. writeln("Damit haben wir die Ableitung von ",eingabe," als: ");
  1391. writeln(f,"Nun ham wir`s geschafft!");
  1392. ausgeben(wurzel);
  1393. writeln(f,"\end{document}");
  1394. kill(wurzel);
  1395. end
  1396. else writeln("Na denn eben nicht!");
  1397. if fromwb then delay(150);
  1398. (* close(f); *)
  1399. closelib(reqbase);
  1400. (*if FromWB then Close (input);*)
  1401. end.
  1402.  
  1403.  
  1404.